As computing technology has advanced, distributed storage systems have become popular choices for deploying applications. Distributed storage systems, such as cloud storage systems, offer reliable storage services with simple application programming interfaces (APIs) that hide the distributed nature of the underlying storage. This hidden distributed nature alleviates the need for application developers to handle distributed-system issues such as data partitioning, fault tolerance, and load balancing. In distributed computing environments, application data can be stored at a storage system while application computations are performed by one or more computing devices located remotely from the storage system.
Although storage system providers typically implement fault-tolerance protocols, these storage systems are not without their problems. For example, different computing devices, computing device programs, and computing device virtual machines often request access to a single storage system object at the same time. While accessing an object, computing devices performing application computations can fail, application processes on devices can crash, and a network connecting the computing devices to the storage system can drop or reorder communications. In order to address these and other problems, storage systems can lock stored objects during access by a computing device. However, locks are not without their problems. One such problem is that a computing device accessing a locked object may fail to complete executing functionality associated with the locked object, causing the storage system to lock an object indefinitely. Furthermore, storage services tend to offer limited, low-level APIs that restrict application operations to objects within a storage area. Thus, it remains difficult to develop applications for distributed computing environments.